{"componentChunkName":"component---src-templates-blog-page-index-tsx","path":"/canal-de-pagamento-bidirecional/","result":{"data":{"mdx":{"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"layout\": \"BlogPage\",\n  \"title\": \"Criar um Canal de pagamento bidirecional\",\n  \"description\": \"Nesse artigo iremos aprender a como criar um canal de pagamento bidirecional através de um contrato inteligente.\",\n  \"image\": \"capa.jpg\",\n  \"tags\": [\"Avançado\", \"Aplicações\"],\n  \"author\": [\"Matheus\"],\n  \"publishedAt\": \"11/06/2022\",\n  \"modifiedAt\": \"20220611\",\n  \"suburl\": \"canal-de-pagamento-bidirecional/\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Nesse artigo iremos aprender a como criar um canal de pagamento bidirecional atrav\\xE9s de um contrato inteligente.\"), mdx(\"h2\", {\n    \"id\": \"canal-de-pagamento-bidirecional\"\n  }, \"Canal de pagamento bidirecional\"), mdx(\"p\", null, \"Os canais de pagamento bidirecionais permitem que os participantes \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Alice\"), \" e \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Bob\"), \" transfiram repetidamente Ether para fora da cadeia.\"), mdx(\"p\", null, \"Os pagamentos podem ser feitos nos dois sentidos, \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Alice\"), \" paga \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Bob\"), \" e \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Bob\"), \" paga \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Alice\"), \".\"), mdx(\"p\", null, \"Veja como este contrato \\xE9 usado:\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Abertura de um canal\")), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Alice e Bob financiam uma carteira multi-sig (assinatura m\\xFAltipla)\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Pr\\xE9-computa\\xE7\\xE3o do endere\\xE7o do canal de pagamento\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Alice e Bob trocam assinaturas de saldos iniciais\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Alice e Bob criam uma transa\\xE7\\xE3o que pode implantar um canal de pagamento da carteira multi-sig\")), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Atualizar saldo dos canais\")), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Repita as etapas 1 a 3 da \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"abertura de um canal\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Na carteira multi-sig, crie uma transa\\xE7\\xE3o que\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"exclua a transa\\xE7\\xE3o que implantou o antigo canal de pagamento\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"e, em seguida, cria uma transa\\xE7\\xE3o que possa implantar um canal de pagamento com os novos saldos\")))), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Fechando um canal quando Alice e Bob concordam com o saldo final\")), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Na carteira multi-sig, crie uma transa\\xE7\\xE3o que\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"envia pagamentos para Alice e Bob\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"e, em seguida, exclua a transa\\xE7\\xE3o que teria criado o canal de pagamento\")))), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Fechar um canal quando Alice e Bob n\\xE3o concordam com os saldos finais\")), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Implante o canal de pagamento do multi-sig\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"chame challengeExit() para iniciar o processo de fechamento de um canal\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Alice e Bob podem sacar fundos assim que o canal expirar\")), mdx(\"p\", null, \"Isso \\xE9 chamado de canal de pagamento bidirecional, pois o pagamento pode ir para ambas as dire\\xE7\\xF5es, de \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Alice\"), \" para \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Bob\"), \" ou \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Bob\"), \" para \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Alice\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.5/contracts/utils/math/SafeMath.sol\\\";\\nimport \\\"github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.5/contracts/utils/cryptography/ECDSA.sol\\\";\\n\\ncontract BiDirectionalPaymentChannel {\\n    using SafeMath for uint;\\n    using ECDSA for bytes32;\\n\\n    event ChallengeExit(address indexed sender, uint nonce);\\n    event Withdraw(address indexed to, uint amount);\\n\\n    address payable[2] public users;\\n    mapping(address => bool) public isUser;\\n\\n    mapping(address => uint) public balances;\\n\\n    uint public challengePeriod;\\n    uint public expiresAt;\\n    uint public nonce;\\n\\n    // Checa na mem\\xF3ria se os dois saldos s\\xE3o maiores do que\\n    // o saldo do endere\\xE7o do contrato\\n    modifier checkBalances(uint[2] memory _balances) {\\n        require(\\n            address(this).balance >= _balances[0].add(_balances[1]),\\n            \\\"saldo do contrato deve ser >= ao saldo total de usu\\xE1rios\\\"\\n        );\\n        _;\\n    }\\n\\n    // NOTA: dep\\xF3sito da carteira multi-sig\\n    constructor(\\n        address payable[2] memory _users,\\n        uint[2] memory _balances,\\n        uint _expiresAt,\\n        uint _challengePeriod\\n    ) payable checkBalances(_balances) {\\n        require(_expiresAt > block.timestamp, \\\"A expira\\xE7\\xE3o deve ser > agora\\\");\\n        require(_challengePeriod > 0, \\\"O per\\xEDodo do desafio deve ser > 0\\\");\\n\\n        for (uint i = 0; i < _users.length; i++) {\\n            address payable user = _users[i];\\n\\n            require(!isUser[user], \\\"o usu\\xE1rio deve ser \\xFAnico\\\");\\n            users[i] = user;\\n            isUser[user] = true;\\n\\n            balances[user] = _balances[i];\\n        }\\n\\n        expiresAt = _expiresAt;\\n        challengePeriod = _challengePeriod;\\n    }\\n\\n    function verify(\\n        bytes[2] memory _signatures,\\n        address _contract,\\n        address[2] memory _signers,\\n        uint[2] memory _balances,\\n        uint _nonce\\n    ) public pure returns (bool) {\\n        for (uint i = 0; i < _signatures.length; i++) {\\n            /*\\n            NOTA: assine com o endere\\xE7o deste contrato para \\n            proteger contra ataques de repeti\\xE7\\xE3o de outros contratos\\n            */\\n            bool valid = _signers[i] ==\\n                keccak256(abi.encodePacked(_contract, _balances, _nonce))\\n                    .toEthSignedMessageHash()\\n                    .recover(_signatures[i]);\\n\\n            if (!valid) {\\n                return false;\\n            }\\n        }\\n\\n        return true;\\n    }\\n\\n    modifier checkSignatures(\\n        bytes[2] memory _signatures,\\n        uint[2] memory _balances,\\n        uint _nonce\\n    ) {\\n        // NOTA: copia a matriz de armazenamento para a mem\\xF3ria\\n        address[2] memory signers;\\n        for (uint i = 0; i < users.length; i++) {\\n            signers[i] = users[i];\\n        }\\n\\n        require(\\n            verify(_signatures, address(this), signers, _balances, _nonce),\\n            \\\"Assinatura inv\\xE1lida\\\"\\n        );\\n\\n        _;\\n    }\\n\\n    modifier onlyUser() {\\n        require(isUser[msg.sender], \\\"N\\xE3o \\xE9 usu\\xE1rio\\\");\\n        _;\\n    }\\n\\n    function challengeExit(\\n        uint[2] memory _balances,\\n        uint _nonce,\\n        bytes[2] memory _signatures\\n    )\\n        public\\n        onlyUser\\n        checkSignatures(_signatures, _balances, _nonce)\\n        checkBalances(_balances)\\n    {\\n        require(block.timestamp < expiresAt, \\\"Per\\xEDodo de desafio expirado\\\");\\n        require(_nonce > nonce, \\\"Nonce deve ser maior que o nonce atual\\\");\\n\\n        for (uint i = 0; i < _balances.length; i++) {\\n            balances[users[i]] = _balances[i];\\n        }\\n\\n        nonce = _nonce;\\n        expiresAt = block.timestamp.add(challengePeriod);\\n\\n        emit ChallengeExit(msg.sender, nonce);\\n    }\\n\\n    function withdraw() public onlyUser {\\n        require(block.timestamp >= expiresAt, \\\"O per\\xEDodo do desafio ainda n\\xE3o expirou\\\");\\n\\n        uint amount = balances[msg.sender];\\n        balances[msg.sender] = 0;\\n\\n        (bool sent, ) = msg.sender.call{value: amount}(\\\"\\\");\\n        require(sent, \\\"Falha ao enviar Ether\\\");\\n\\n        emit Withdraw(msg.sender, amount);\\n    }\\n}\\n\")), mdx(\"br\", null), mdx(\"h3\", {\n    \"id\": \"testar-no-remix\"\n  }, \"Testar no \", mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"https://remix.ethereum.org/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"Remix\")), mdx(\"br\", null), mdx(\"br\", null));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"title":"Criar um Canal de pagamento bidirecional","description":"Nesse artigo iremos aprender a como criar um canal de pagamento bidirecional através de um contrato inteligente.","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAgP/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAFxjYJLB//EABoQAAICAwAAAAAAAAAAAAAAAAECERIEECH/2gAIAQEAAQUCUxkPcKs1qJ7r/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAHhAAAQMEAwAAAAAAAAAAAAAAAQACEQMQMVESIWH/2gAIAQEABj8CINQlzpgaRIl3iE5XIDvazb//xAAcEAACAgIDAAAAAAAAAAAAAAABEQAhEDFBYaH/2gAIAQEAAT8hZSCOghPsHCnCIgpLENUDqgD35x//2gAMAwEAAgADAAAAENDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHxABAQABAgcAAAAAAAAAAAAAAREAITEQQVFhgZHR/9oACAEBAAE/EBq+BpzQTk/O+QZ+k17YxBgpKPjTCpnIg1Oi74gVk2Bw/9k=","aspectRatio":1.5151515151515151,"src":"/static/13d83b36c8a94464f3d569ac4233b5dd/0cb3d/capa.jpg","srcSet":"/static/13d83b36c8a94464f3d569ac4233b5dd/f836f/capa.jpg 200w,\n/static/13d83b36c8a94464f3d569ac4233b5dd/2244e/capa.jpg 400w,\n/static/13d83b36c8a94464f3d569ac4233b5dd/0cb3d/capa.jpg 536w","sizes":"(max-width: 536px) 100vw, 536px"}}},"tags":["Avançado","Aplicações"],"author":["Matheus"],"suburl":"canal-de-pagamento-bidirecional/","publishedAt":"11/06/2022","modifiedAt":"20220611"},"tableOfContents":{"items":[{"url":"#canal-de-pagamento-bidirecional","title":"Canal de pagamento bidirecional","items":[{"url":"#testar-no-remix","title":"Testar no Remix"}]}]},"timeToRead":1},"allMdx":{"nodes":[{"frontmatter":{"suburl":"sistema-de-swap-estavel-amm/","title":"Como criar um sistema de Swap estável AMM","tags":["Avançado","DeFi"]}},{"frontmatter":{"suburl":"produto-constante-amm/","title":"Como criar um produto constante AMM","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"soma-constante-amm/","title":"Como criar uma soma constante AMM","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-cofre/","title":"Como criar um sistema de Cofre","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-staking/","title":"Como criar um sistema de Staking de Recompensas","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-preco-chainlink-oracle/","title":"Como criar um sistema de preços Oracle","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"exemplos-de-uso-do-uniswap-v3/","title":"Exemplos de uso do Uniswap V3","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"fornecimento-unilateral-com-uniswap-v2/","title":"Fornecimento unilateral ideal com Uniswap V2","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"adicionar-e-remover-liquidez-com-uniswap-v2/","title":"Como adicionar e remover liquidez com Uniswap V2","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"swap-com-uniswap-v2/","title":"Como realizar Swap com Uniswap V2","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"testes-com-echidna/","title":"Como realizar testes com Echidna","tags":["Intermediário"]}},{"frontmatter":{"suburl":"ignorar-verificacao-do-tamanho-do-contrato/","title":"Como ignorar a verificação do tamanho do contrato","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"repeticao-de-assinatura/","title":"Repetição de assinatura","tags":["Avançado","Hacks"]}},{"frontmatter":{"suburl":"manipular-timestamp-do-bloco/","title":"Manipulando o timestamp do bloco na blockchain","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ataque-front-running/","title":"Ataque utilizando a técnica front running","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"honeypot/","title":"Criar uma armadilha para hackers com a técnica honeypot","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ocultar-script-malicioso/","title":"Como um contrato malicioso esconde seu script","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"phishing-com-txorigin/","title":"Phishing com tx.origin","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"negacao-de-servico/","title":"Inutilizar um contrato através da negação de serviço","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"fonte-de-aleatoriedade/","title":"Fonte de Aleatoriedade","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"chamada-de-funcao-delegatecall/","title":"Chamada de função delegatecall","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"acessando-variaveis-privadas/","title":"Acessando variáveis privadas","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"auto-destruicao/","title":"Ataques com Auto-destruição","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"estouro-de-memoria/","title":"Ataques com estouro de memória","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ataque-de-reentrada/","title":"Ataque de reentrada, aprenda como funciona e como evitar","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"bloqueio-de-tempo-timelock/","title":"Criar um contrato com bloqueio de tempo","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"contrato-para-multichamadas/","title":"Criar contrato para Multichamada de funções","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"financiamento-coletivo-crowd-fund/","title":"Criar um sistema de financiamento coletivo","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"sistema-de-leilao-ingles-holandes/","title":"Criar um sistema de leilão inglês e holandês","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"canal-de-pagamento-bidirecional/","title":"Criar um Canal de pagamento bidirecional","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"canal-de-pagamento-unidirecional/","title":"Criar um Canal de pagamento unidirecional","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"gravar-dados-no-slot/","title":"Como gravar dados em qualquer slot","tags":["Intermediário","Aplicações"]}},{"frontmatter":{"suburl":"implantar-contrato-com-proxy/","title":"Como implantar qualquer contrato com Proxy","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"trabalhando-com-proxy/","title":"Trabalhando com Proxy","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"precomputar-endereco-contrato/","title":"Pré-computar endereço do Contrato com Create2","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"token-erc721/","title":"Criando nosso primeiro Token ERC721","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"token-erc20/","title":"Criando nosso primeiro Token ERC20","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-mapeamento-iteravel/","title":"Mapeamento Iterável","tags":["Intermediário","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-arvore-merkle/","title":"Árvore de Merkle","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-multi-assinatura/","title":"Carteira com Multi-Assinaturas","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-wallet/","title":"Carteira de Tokens","tags":["Iniciante","Aplicações"]}},{"frontmatter":{"suburl":"assinaturas-e-hashing-keccak/","title":"Verificando assinatura hashing com Keccak256","tags":["Intermediário","Avançado"]}},{"frontmatter":{"suburl":"abi/","title":"O que é ABI e para que serve?","tags":["Iniciante"]}},{"frontmatter":{"suburl":"import-e-libraries/","title":"Import e Libraries, para que servem?","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"criar-contrato-simples/","title":"Criar um contrato através de outro contrato","tags":["Intermediário"]}},{"frontmatter":{"suburl":"call-fallback-delegatecall/","title":"Call, Fallback, Delegatecall e chamadas de contratos","tags":["Intermediário"]}},{"frontmatter":{"suburl":"transfer-send-call/","title":"Enviar Ether com transfer, send e call","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"visibilidade-interface-pagavel/","title":"Visibilidade, Interfaces e Funções Pagáveis","tags":["Intermediário"]}},{"frontmatter":{"suburl":"evento-construtor-heranca/","title":"Evento, Construtor e Herança","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"tratamento-de-erros/","title":"Tratamento de erros de condições e exceções","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"funcoes/","title":"Funções e Modificadores","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"armazenamento/","title":"Armazenamento de Dados","tags":["Intermediário"]}},{"frontmatter":{"suburl":"estruturas/","title":"Estruturas - Struct","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"enum/","title":"Enum - Enumeradores","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"mapping-arrays/","title":"Mapping e Arrays","tags":["Iniciante"]}},{"frontmatter":{"suburl":"if-else-for-while/","title":"If, Else, For e While","tags":["Iniciante"]}},{"frontmatter":{"suburl":"ether-wei-gas/","title":"Ether, Wei e Taxa de Gas","tags":["Iniciante"]}},{"frontmatter":{"suburl":"variaveis/","title":"Entendendo as Variáveis","tags":["Iniciante"]}},{"frontmatter":{"suburl":"primeiro-aplicativo/","title":"Meu primeiro aplicativo","tags":["Iniciante","Aplicações"]}}]},"topicsYaml":{"topics":[{"desc":"Todos os conteúdos de nível iniciante estão disponíveis aqui","title":"Iniciante","url":"iniciante/"},{"desc":"Todos os conteúdos de nível intermediário estão disponíveis aqui","title":"Intermediário","url":"intermediario/"},{"desc":"Todos os conteúdos de nível avançado estão disponíveis aqui","title":"Avançado","url":"avancado/"},{"desc":"Todos os artigos referentes a exemplos de aplicações do Solidity, estão disponíveis aqui","title":"Aplicações","url":"aplicacoes/"},{"desc":"Todos os artigos referentes a exemplos de aplicação de hacks do Solidity, estão disponíveis aqui","title":"Hacks","url":"hacks/"},{"desc":"Todos os artigos referentes a exemplos de aplicação DeFi do Solidity, estão disponíveis aqui","title":"DeFi","url":"defi/"},{"desc":"Artigos de outras linguagens de programação, exemplos de interação entre a blockchain e aplicativos externos, estão disponíveis aqui","title":"Outros Artigos","url":"artigos/"}]}},"pageContext":{"suburl":"canal-de-pagamento-bidirecional/","postTopics":["Avançado","Aplicações"],"publishedAt":"11/06/2022","prevArticle":{"title":"Criar um Canal de pagamento unidirecional","layout":"BlogPage","suburl":"canal-de-pagamento-unidirecional/","author":["Matheus"],"tags":["Avançado","Aplicações"],"publishedAt":"10/06/2022","modifiedAt":"20220610"},"nextArticle":{"title":"Criar um sistema de leilão inglês e holandês","layout":"BlogPage","suburl":"sistema-de-leilao-ingles-holandes/","author":["Matheus"],"tags":["Avançado","Aplicações"],"publishedAt":"13/06/2022","modifiedAt":"20220613"}}},"staticQueryHashes":["119291576","2330562257","4065828390"]}